<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>保安措施和安全模式</title>

 </head>
 <body><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="features.safe-mode.html">安全模式</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="features.safe-mode.functions.html">被安全模式限制或屏蔽的函数</a></div>
 <div class="up"><a href="features.safe-mode.html">安全模式</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div><hr /><div id="ini.sect.safe-mode" class="sect1">
  <h2 class="title">保安措施和安全模式</h2>
  <p class="para">
   <table class="doctable table">
    <caption><strong>保安措施和安全模式配置指令</strong></caption>
    
     <thead>
       <tr>
        <th>名字</th>
        <th>默认</th>
        <th>可修改范围</th>
        <th>更新日志</th>
       </tr>

     </thead>

     <tbody class="tbody">
      <tr>
        <td><a href="ini.sect.safe-mode.html#ini.safe-mode" class="link">safe_mode</a></td>
       <td>&quot;0&quot;</td>
       <td>PHP_INI_SYSTEM</td>
       <td class="empty">&nbsp;</td>
      </tr>

      <tr>
        <td><a href="ini.sect.safe-mode.html#ini.safe-mode-gid" class="link">safe_mode_gid</a></td>
       <td>&quot;0&quot;</td>
       <td>PHP_INI_SYSTEM</td>
       <td>自 PHP 4.1.0 起可用，在 PHP 5.4.0 中移除。</td>
      </tr>

      <tr>
        <td><a href="ini.sect.safe-mode.html#ini.safe-mode-include-dir" class="link">safe_mode_include_dir</a></td>
       <td>NULL</td>
       <td>PHP_INI_SYSTEM</td>
       <td>自 PHP 4.1.0 起可用</td>
      </tr>

      <tr>
        <td><a href="ini.sect.safe-mode.html#ini.safe-mode-exec-dir" class="link">safe_mode_exec_dir</a></td>
       <td>&quot;&quot;</td>
       <td>PHP_INI_SYSTEM</td>
       <td class="empty">&nbsp;</td>
      </tr>

      <tr>
        <td><a href="ini.sect.safe-mode.html#ini.safe-mode-allowed-env-vars" class="link">safe_mode_allowed_env_vars</a></td>
       <td>&quot;PHP_&quot;</td>
       <td>PHP_INI_SYSTEM</td>
       <td class="empty">&nbsp;</td>
      </tr>

      <tr>
        <td><a href="ini.sect.safe-mode.html#ini.safe-mode-protected-env-vars" class="link">safe_mode_protected_env_vars</a></td>
       <td>&quot;LD_LIBRARY_PATH&quot;</td>
       <td>PHP_INI_SYSTEM</td>
       <td class="empty">&nbsp;</td>
      </tr>

     </tbody>
    
   </table>

   有关 PHP_INI_* 样式的更多详情与定义，见 <a href="configuration.changes.modes.html" class="xref">配置可被设定范围</a>。
  </p>

  <p class="para">这是配置指令的简短说明。</p>

  <p class="para">
   <dl>

    
     <dt id="ini.safe-mode">
      <em><code class="parameter">safe_mode</code></em>
      <span class="type"><a href="language.types.boolean.html" class="type boolean">boolean</a></span>
     </dt>

     <dd>

      <p class="para">
       是否启用 PHP 的安全模式。
      </p>
     </dd>

    
    
     <dt id="ini.safe-mode-gid">
      <em><code class="parameter">safe_mode_gid</code></em>
      <span class="type"><a href="language.types.boolean.html" class="type boolean">boolean</a></span>
     </dt>

     <dd>

      <p class="para">
       默认情况下，安全模式在打开文件时会做 UID 比较检查。如果想将其放宽到
       GID 比较，则打开 safe_mode_gid。是否在文件访问时使用
       <em>UID</em>（<strong><code>FALSE</code></strong>）或者
       <em>GID</em>（<strong><code>TRUE</code></strong>）来做检查。
      </p>
     </dd>

    
    
     <dt id="ini.safe-mode-include-dir">
      <em><code class="parameter">safe_mode_include_dir</code></em>
      <span class="type"><a href="language.types.string.html" class="type string">string</a></span>
     </dt>

     <dd>

      <p class="para">
       当从此目录及其子目录（目录必须在 <a href="ini.core.html#ini.include-path" class="link">include_path</a>
       中或者用完整路径来包含）包含文件时越过
       <em>UID</em>/<em>GID</em> 检查。
      </p>
      <span class="simpara">
       从 PHP 4.2.0 开始，本指令可以接受和 <a href="ini.core.html#ini.include-path" class="link">include_path</a>
       指令类似的风格用冒号（Windows 中是分号）隔开的路径，而不只是一个目录。
      </span>
      <span class="simpara">
       指定的限制实际上是一个前缀，而非一个目录名。这也就是说“safe_mode_include_dir
       = /dir/incl”将允许访问“/dir/include”和“/dir/incls”，如果它们存在的话。如果希望将访问控制在一个指定的目录，那么请在结尾加上一个斜线，例如：“safe_mode_include_dir
       = /dir/incl/”。
      </span>
      <span class="simpara">
       如果本指令的值为空，在 PHP 4.2.3 中以及 PHP 4.3.3 起具有不同
       <em>UID</em>/<em>GID</em>
       的文件将不能被包含。在较早版本中，所有文件都能被包含。
      </span>
     </dd>

    
    
     <dt id="ini.safe-mode-exec-dir">
      <em><code class="parameter">safe_mode_exec_dir</code></em>
      <span class="type"><a href="language.types.string.html" class="type string">string</a></span>
     </dt>

     <dd>

      <p class="para">
       如果 PHP 使用了安全模式，<span class="function"><a href="function.system.html" class="function">system()</a></span> 和其它<a href="ref.exec.html" class="link">程序执行函数</a>将拒绝启动不在此目录中的程序。必须使用
       <em>/</em> 作为目录分隔符，包括 Windows 中。
      </p>
     </dd>

    
    
     <dt id="ini.safe-mode-allowed-env-vars">
      <em><code class="parameter">safe_mode_allowed_env_vars</code></em>
      <span class="type"><a href="language.types.string.html" class="type string">string</a></span>
     </dt>

     <dd>

      <p class="para">
       设置某些环境变量可能是潜在的安全缺口。本指令包含有一个逗号分隔的前缀列表。在安全模式下，用户只能改变那些名字具有在这里提供的前缀的环境变量。默认情况下，用户只能设置以
       PHP_ 开头的环境变量（例如 PHP_FOO = BAR）。
      </p>
      <blockquote class="note"><p><strong class="note">Note</strong>: 
       <p class="para">
        如果本指令为空，PHP 将使用户可以修改任何环境变量！
       </p>
      </p></blockquote>
     </dd>

    
    
     <dt id="ini.safe-mode-protected-env-vars">
      <em><code class="parameter">safe_mode_protected_env_vars</code></em>
      <span class="type"><a href="language.types.string.html" class="type string">string</a></span>
     </dt>

     <dd>

      <p class="para">
       本指令包含有一个逗号分隔的环境变量的列表，最终用户不能用
       <span class="function"><a href="function.putenv.html" class="function">putenv()</a></span> 来改变这些环境变量。甚至在
       safe_mode_allowed_env_vars 中设置了允许修改时也不能改变这些变量。
      </p>
     </dd>

    
   </dl>

  </p>
  <p class="para">
   参见 <a href="ini.core.html#ini.open-basedir" class="link">open_basedir</a>、
    <a href="ini.core.html#ini.disable-functions" class="link">disable_functions</a>、
    <a href="ini.core.html#ini.disable-classes" class="link">disable_classes</a>、
    <a href="ini.core.html#ini.register-globals" class="link">register_globals</a>、
    <a href="errorfunc.configuration.html#ini.display-errors" class="link">display_errors</a> 和
    <a href="errorfunc.configuration.html#ini.log-errors" class="link">log_errors</a>。
  </p>

  <p class="para">
   当 <a href="ini.sect.safe-mode.html#ini.safe-mode" class="link">safe_mode</a> 设置为 on，PHP
   将通过文件函数或其目录检查当前脚本的拥有者是否和将被操作的文件的拥有者相匹配。例如：
   <div class="example-contents">
<div class="lscode"><pre class="lscode">-rw-rw-r--    1 rasmus   rasmus       33 Jul  1 19:20 script.php
-rw-r--r--    1 root     root       1116 May 26 18:01 /etc/passwd</pre>
</div>
   </div>

   运行 <var class="filename">script.php</var>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />&nbsp;readfile</span><span style="color: #007700">(</span><span style="color: #DD0000">'/etc/passwd'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

   如果安全模式被激活，则将会导致以下错误：
   <div class="example-contents screen">
<div class="cdata"><pre>
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2
</pre></div>
   </div>
  </p>
  <p class="para">
   同时，或许会存在这样的环境，在该环境下，宽松的 <em>GID</em>
   检查已经足够，但严格的 <em>UID</em>
   检查反而是不适合的。可以用 <a href="ini.sect.safe-mode.html#ini.safe-mode-gid" class="link">safe_mode_gid</a>
   选项来控制这种检查。如果设置为 <em>On</em>
   则进行宽松的 <em>GID</em> 检查；设置为
   <em>Off</em>（默认值）则进行 <em>UID</em> 检查。
  </p>
  <p class="para">
   除了 <a href="ini.sect.safe-mode.html#ini.safe-mode" class="link">safe_mode</a> 以外，如果设置了
   <a href="ini.core.html#ini.open-basedir" class="link">open_basedir</a>
   选项，则所有的文件操作将被限制在指定的目录下。例如：
   <div class="example-contents">
<div class="inicode"><pre class="inicode">&lt;Directory /docroot&gt;
  php_admin_value open_basedir /docroot
&lt;/Directory&gt;</pre>
</div>
   </div>

   如果在设置了 <a href="ini.core.html#ini.open-basedir" class="link">open_basedir</a>
   选项后运行同样的 <var class="filename">script.php</var>，则其结果会是：
   <div class="example-contents screen">
<div class="cdata"><pre>
Warning: open_basedir restriction in effect. File is in wrong directory in
/docroot/script.php on line 2
</pre></div>
   </div>
  </p>
  <p class="para">
   也可以单独地屏蔽某些函数。请注意
   <a href="ini.core.html#ini.disable-functions" class="link">disable_functions</a>
   选项不能在 <var class="filename">php.ini</var> 文件外部使用，也就是说无法在 <var class="filename">httpd.conf</var>
   文件的按不同虚拟主机或不同目录的方式来屏蔽函数。如果将如下内容加入到
   <var class="filename">php.ini</var> 文件：
   <div class="example-contents">
<div class="inicode"><pre class="inicode">disable_functions readfile,system</pre>
</div>
   </div>

   则会得到如下的输出：
   <div class="example-contents screen">
<div class="cdata"><pre>
Warning: readfile() has been disabled for security reasons in
/docroot/script.php on line 2
</pre></div>
   </div>
  </p>
  <div class="warning"><strong class="warning">Warning</strong>
   <p class="para">
    当然，这些 PHP 限制不适用于可执行文件。
   </p>
  </div>
 </div><hr /><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="features.safe-mode.html">安全模式</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="features.safe-mode.functions.html">被安全模式限制或屏蔽的函数</a></div>
 <div class="up"><a href="features.safe-mode.html">安全模式</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div></body></html>
